package cn.shujuhai.common.config;

import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * 全局安全响应头过滤器（适用于 Spring Boot + Sa-Token 项目）
 */
@Component
public class SecurityHeaderFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {

        HttpServletResponse res = (HttpServletResponse) response;

        // 防止反射型 XSS 攻击
        res.setHeader("X-XSS-Protection", "1; mode=block");

        // 防止内容类型嗅探
        res.setHeader("X-Content-Type-Options", "nosniff");

        // 防止页面被 iframe 嵌套（防点击劫持）
        res.setHeader("X-Frame-Options", "SAMEORIGIN");

        // 强制 HTTPS（HSTS） - 仅在启用 HTTPS 时生效
        res.setHeader("Strict-Transport-Security", "max-age=31536000; includeSubDomains");

        // 防止缓存敏感信息
        res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
        res.setHeader("Pragma", "no-cache");
        res.setHeader("Expires", "0");

        res.setHeader("Permissions-Policy", "geolocation=(), microphone=(), camera=()");


//        res.setHeader("Content-Security-Policy",
//                "default-src * data: blob:; " +  // 放开默认来源
//                        "script-src * 'unsafe-inline' 'unsafe-eval' data: blob:; " +  // 放开脚本来源
//                        "style-src * 'unsafe-inline' data:; " +
//                        "img-src * data: blob:; " +
//                        "font-src * data:; " +
//                        "frame-src *; " +
//                        "connect-src *;"
//        );

        res.setHeader("Content-Security-Policy",
                "default-src 'self'; " +  // 只允许同域名的资源
                        "script-src 'self' 'unsafe-inline' 'unsafe-eval'; " +  // 允许同域名的脚本和内联脚本
                        "style-src 'self' 'unsafe-inline'; " +  // 允许同域名的样式和内联样式
                        "img-src * data: blob:; " +  // 允许同域名的图片和数据URI
                        "font-src * data:; " +  // 允许同域名的字体
                        "frame-src 'self'; " +  // 只允许同域名的框架
                        "connect-src 'self'; "  // 只允许同域名的连接
        );


        res.setHeader("Cross-Origin-Resource-Policy", "");

        // 强制跨源隔离（启用共享内存、安全的 WebAssembly）
        res.setHeader("Cross-Origin-Embedder-Policy", "");
        res.setHeader("Cross-Origin-Opener-Policy", "");

        // 跨域资源共享设置（示例：允许所有）
        res.setHeader("Access-Control-Allow-Origin", "*");

        chain.doFilter(request, response);
    }
}
